<?php

require_once 'BancoDeDados.php';
require_once 'Grupo.php';
require_once 'EspacoCultural.php';

class Usuario {

    private $cod_usuario;
    private $nome;
    private $login;
    private $email;
    private $senha;
    private $espacos;
    private $grupo;
    public function &getEmail() {
        return $this->email;
    }

    public function setEmail(&$email) {
        $this->email = &$email;
    }

    public function &getCod_usuario() {
        return $this->cod_usuario;
    }

    public function setCod_usuario(&$cod_usuario) {
        $this->cod_usuario = &$cod_usuario;
    }

    public function &getNome() {
        return $this->nome;
    }

    public function setNome(&$nome) {
        $this->nome = &$nome;
    }

    public function &getLogin() {
        return $this->login;
    }

    public function setLogin(&$login) {
        $this->login = &$login;
    }

    public function &getSenha() {
        return $this->senha;
    }

    public function setSenha(&$senha) {
        $this->senha = $senha;
    }

    public function &getEspacos() {
        return $this->espacos;
    }

    public function setEspacos(&$espacos) {
        $this->espacos = $espacos;
    }

    /**
     *
     * @return Grupo
     */
    public function &getGrupo() {
        return $this->grupo;
    }

    public function setGrupo(Grupo &$grupo) {
        $this->grupo = &$grupo;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Usuário existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into usuario (nome, email, login, senha, cod_grupo) values(?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->nome, $this->email, $this->login, $this->senha, $this->grupo->getCod_grupo()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }

        $result = $link->query('select cod_usuario from usuario where login = ?', array($this->login));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Usuário inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Usuário com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $this->setCod_usuario($row['cod_usuario']);
        $link->commit();
    }

    public function cadastrarEspaco(EspacoCultural &$espaco) {
        if (!$this->espacos[$espaco->getCod_espaco()] instanceof EspacoCultural) {
            $banco = BancoDeDados::getInstance();
            $link = $banco->getLink();
            $stmt = $link->prepare('insert into usuario_espaco (cod_usuario, cod_espaco) values(?,?)');
            $result = $link->execute($stmt, array($this->cod_usuario, $espaco->getCod_espaco()));
            if (DB::isError($result)) {
                $link->rollBack();
                throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
            }
            $link->commit();
            $this->espacos[$espaco->getCod_espaco()] = &$espaco;
        }
    }

    public function excluirEspaco(&$cod_espaco) {
        if ($this->espacos[$cod_espaco] instanceof EspacoCultural) {
            $banco = BancoDeDados::getInstance();
            $link = $banco->getLink();
            $stmt = $link->prepare('delete from usuario_espaco where cod_usuario = ? and cod_espaco = ?');
            $result = $link->execute($stmt, array($this->cod_usuario, $this->espacos[$cod_espaco]->getCod_espaco()));
            if (DB::isError($result)) {
                $link->rollBack();
                throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
            }
            $link->commit();
            unset($this->espacos[$cod_espaco]);
        }
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        throw new Exception($campo_id." - ".$campo_valor);
        if ($campo_id == 'nome' && $this->nome != $campo_valor) {
            $temp = &$this->nome;
            $this->nome = &$campo_valor;
        } elseif ($campo_id == 'login' && $this->login != $campo_valor) {
            $temp = &$this->login;
            $this->login = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Usuário existente |".$temp);
            }
        } elseif ($campo_id == 'email' && $this->email != $campo_valor) {
            $temp = &$this->email;
            $this->email = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Usuário existente |".$temp);
            }
        } elseif ($campo_id == 'senha' && $this->senha != $campo_valor) {
            $temp = &$this->senha;
            $this->senha = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update usuario set ' . $campo_id . ' = ? where cod_usuario = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_usuario));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}"." |".$temp);
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from usuario where cod_usuario = ?');
        $result = $link->execute($stmt, array($this->cod_usuario));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function listar(&$cod_grupo) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from usuario where cod_grupo = ?', array($cod_grupo));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $usuario = new Usuario();
            $usuario->setCod_usuario($row['cod_usuario']);
            $usuario->setNome($row['nome']);
            $usuario->setLogin($row['login']);
            $usuario->setEmail($row['email']);
            $resultado[$row['cod_usuario']] = &$usuario;
            unset($usuario);
        }
        return $resultado;
    }

    public static function consultar(&$cod_usuario) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from usuario where cod_usuario = ?', array($cod_usuario));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Usuário inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Usuário com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $usuario = new Usuario();
        $usuario->setCod_usuario($row['cod_usuario']);
        $usuario->setNome($row['nome']);
        $usuario->setLogin($row['login']);
        $usuario->setSenha($row['senha']);
        $usuario->setEmail($row['email']);
        $usuario->setEspacos(EspacoCultural::listarPorUsuario($row['cod_usuario']));
        return $usuario;
    }
    
    public static function consultarSenha(&$email) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from usuario where email = ?', array($email));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Usuário inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Usuário com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $usuario = new Usuario();
        $usuario->setCod_usuario($row['cod_usuario']);
        $usuario->setNome($row['nome']);
        $usuario->setLogin($row['login']);
        $usuario->setEmail($row['email']);
        $usuario->setSenha($row['senha']);
        return $usuario;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_usuario from usuario where login = ? and email = ? and cod_usuario != ?', array($this->login, $this->email, $this->cod_usuario));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }

    public static function validarUsuario(&$login, &$senha) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from usuario where login = ? and senha = ?', array($login, $senha));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Usuário ou senha inválidos, por favor verifique!");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um usuário com o mesmo nome e senha, informe ao administrador!");
        }
        $result->fetchInto($row);
        $usuario = new Usuario();
        $usuario->setCod_usuario($row['cod_usuario']);
        $usuario->setNome($row['nome']);
        $usuario->setLogin($row['login']);
        $usuario->setSenha($row['senha']);
        $usuario->setGrupo(Grupo::consultarPorUsuario($row['cod_grupo']));
        //$usuario->setEspacos(EspacoCultural::listarPorUsuario($row['cod_usuario']));
        return $usuario;
    }

}
?>